package com.dd.census.tools.excel;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelImport {

	public <E> List<E> getList(InputStream is, Class<E> clazz) throws Exception {
		return getList(is, clazz, 1);
	}

	public <E> List<E> getList(InputStream is, Class<E> clazz, Integer skipNumber) throws Exception {

		// 创建工作表
		Workbook wb = new XSSFWorkbook(is);
		// 获取第一个sheet页
		Sheet sheet = wb.getSheetAt(0);
		// 结果集
		List<E> ret = new ArrayList<E>();
		// 文档总行数
		int rows = sheet.getLastRowNum();
		// 逐行获取数据
		for (int i = skipNumber; i <= rows; i++) {
			// 当前行
			Row row = sheet.getRow(i);
			// 当前对象
			E obj = clazz.newInstance();
			// 所有字段
			Field[] fs = clazz.getDeclaredFields();
			for (Field f : fs) {
				// 包含注解的字段
				ExcelField ef = f.getAnnotation(ExcelField.class);
				if (ef != null) {
					// 从行中取得注解标识的列
					Cell cell = row.getCell(ef.index());
					// 方法名首字母大写
					String n0 = f.getName().substring(0, 1).toUpperCase();
					// 方法名其他部分
					String n1 = f.getName().substring(1);
					// 字段类型
					Class<?> fieldType = f.getType();
					// 获取字段的set方法
					Method m = clazz.getDeclaredMethod("set" + n0 + n1, fieldType);
					// 根据不同类型执行set方法
					if (String.class == fieldType) {
						// 字符串
						m.invoke(obj, new Object[] { String.valueOf(cell.getStringCellValue()) });
					} else if (Integer.class == fieldType) {
						// 整数型
						m.invoke(obj, new Object[] { new Double(cell.getNumericCellValue()).intValue() });
					} else if (Double.class == fieldType) {
						// 浮点型
						m.invoke(obj, new Object[] { cell.getNumericCellValue() });
					} else if (Date.class == fieldType) {
						// 日期型
						m.invoke(obj, new Object[] { cell.getDateCellValue() });
					}
				}
			}
			ret.add(obj);
		}
		return ret;
	}
}
